# 5. 容器类型
# 1.1 数学运算符
'''(1) +：用于拼接两个容器
(2) +=：用原容器与右侧容器拼接,并重新绑定变量
(3) *：重复生成容器元素
(4) *=：用原容器生成重复元素, 并重新绑定变量
(5) < <= > >= == !=：依次比较两个容器中元素,一但不同则返回比较结果。
'''
import copy
name = "马超"
print("我的名字是" + name)
print(f'我的名字是{name}')
name += '是我'
print(name)
name *= 2
print(name)

# 1.2 成员运算符 in
print("超人" in "我是马超人很好")
print("超好" in "我是马超人很好")

# 1.3 索引index
message = "我是花果山齐天大圣"
print(message[2])  # 花
print(message[-2])  # 大
print(len(message))  # 9

# 1.4 切片slice  容器[开始索引:结束索引:步长]
message = "我是花果山齐天大圣"
print(message[2:5:1])  # 花果山
print(message[2:5])  # 花果山
print(message[2:5:2])  # 花山
print(message[2:-5])  # 花果
print(message[:-4])  # 我是花果山
print(message[2:])  # 花果山齐天大圣
print(message[-2:3])  # 空
print(message[-2:3:-1])  # 大天齐山
# 翻转
print(message[::-1])  # 圣大天齐山果花是我

# 1.5 内建函数
arr = [1, 2, 3, 5, 7, 8]
print(len(arr))  # 6
print(max(arr))  # 8
print(min(arr))  # 1
print(sum(arr))  # 26


# 2 字符串 str
# 2.3 引号
print("'引号'")  # 双引号内的单引号
print('"引号"')  # 单引号内的双引号
print(''' '"三引号"' ''')  # 三引号内可以包含单引号和双引号
print(''' '"三
      引号"' ''')  # 换行会自动转换为换行符\n

# 2.3.3 转义字符 \   改变字符的原始含义。
print("\"")  # "
# 原始字符串：取消转义。r
print(r"C:\newfile\test.py")  # C:\newfile\test.py

# 2.3.4 字符串格式化
# %s 字符串
name = "马超"
age = 18
print("我的名字是%s,年龄是%d" % (name, age))  # 我的名字是马超,年龄是18
# %d 整数
print("成功率为%d%%" % 5)  # 成功率为5%
# %f 浮点数
print("价格%.2f" % (5 / 2))  # 价格2.50
print("湖北确诊%d人,治愈%d人,治愈率%.2f" %
      (67802, 63326, 0.93))  # 湖北确诊67802人,治愈63326人,治愈率0.93
print("%d秒是0%d分零%d秒" % (70, 70 // 60, 70 % 60))


# 3 列表 list

# 3.2 基础操作
# (1) 创建列表：
listobj = [1, 2, 3, 4, 5, 6]
print(listobj)  # [1,2,3,4,5,6]

listobj = list(range(10))
print(listobj)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9]

# (2) 添加元素：
listobj.append(10)  # 在列表后面插入
print(listobj)  # [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10]

listobj.insert(5, 100)  # 在列表任意位置插入
print(listobj)  # [0, 1, 2, 3, 4, 100, 5, 6, 7, 8, 9, 10]

# (3) 定位元素：
print(listobj[5])  # 100
newlist = listobj[1:5]
print(newlist)  # [1, 2, 3, 4]
listobj[1:5] = [4, 3, 2, 1]  # 替换原有列表数据
print(listobj)  # [0, 4, 3, 2, 1, 100, 5, 6, 7, 8, 9, 10]

# (4) 删除元素：
listobj.remove(100)
print(listobj)  # [0, 4, 3, 2, 1, 5, 6, 7, 8, 9, 10]

del listobj[10]
print(listobj)  # [0, 4, 3, 2, 1, 5, 6, 7, 8, 9, 10]
del listobj[1:5]
print(listobj)  # [0, 5, 6, 7, 8, 9]

# (5) 遍历：
# 从头到尾读取：
for item in listobj:
    print(item)

for i in range(len(listobj)):
    listobj[i] *= 2
print(listobj)  # [0, 10, 12, 14, 16, 18]

# 3.3 深拷贝和浅拷贝
list01 = ["北京", "上海"]
list02 = list01  # 把列表引用给了变量，列表更改了会跟着变
list01[0] = "广东"
list03 = list01[:]  # 只是复制了列表数据，生成了新的列表
list03[-1] = "深圳"
print(list01)  # ?['广东', '上海']
print(list02)  # ?['广东', '上海']
print(list03)  # ?['广东', '深圳']

list01 = ["北京", "上海", "深圳"]
list02 = list01  # 把列表引用给了变量
list01.insert(0, "天津")
del list01[1]
print(list01)  # ?['天津', '上海', '深圳']
print(list02)  # ?['天津', '上海', '深圳']

list01 = ["北京", ["上海", "深圳"]]
list02 = list01  # 把列表引用给了变量
list03 = list01[:]  # 生成了新的列表
list04 = copy.deepcopy(list01)  # 生成了新的列表
list04[0] = "北京04"
list04[1][1] = "深圳04"
print(list01)  # ?['北京', ['上海', '深圳']]
print(list02)  # ?['北京', ['上海', '深圳']]
print(list03)  # ?['北京', ['上海', '深圳']]
# copy.deepcopy(list01) 是深拷贝列表
print(list04)  # ?['北京04', ['上海', '深圳04']]

list03[0] = "北京03"
list03[1][1] = "深圳03"
# [:]切片是浅拷贝列表，生成了新的列表
print(list01)  # ?['北京', ['上海', '深圳03']]
print(list03)  # ?['北京03', ['上海', '深圳03']]

list02[0] = "北京02"
list02[1][1] = "深圳02"
print(list01)  # ?['北京02', ['上海', '深圳02']]


# 3.4 列表与字符串转换

# (1) 列表转换为字符串：
list01 = ['a', 'b', 'c']
result = '-'.join(list01)
print(result)  # a-b-c

str01 = 'a;b;c'
strlist = str01.split(";")
print(strlist)  # ['a', 'b', 'c']

# 3.5 列表推导式

# (2) 语法：
'''
变量 = [表达式 for 变量 in 可迭代对象]
变量 = [表达式 for 变量 in 可迭代对象 if 条件]
'''

list01 = [9, 15, 65, 6, 78, 89]
list02 = []
for item in list01:
    if item % 3 == 0:
        list02.append(item)
print(list02)  # [9, 15, 6, 78]
# 需求:在list01中挑出能被3整除的数字存入list02
list03 = [item for item in list01 if item % 3 == 0]
print(list03)#[9, 15, 6, 78]
# 需求:在list01中所有数字的个位存储list03
list03 = [item % 10 for item in list01]
print(list03)#[9, 5, 5, 6, 8, 9]


#4 元组 tuple

#(1) 创建元组：
tup = (10,20,30)
print(tup)
list01 = ['a','b','c']
tup01 = tuple(list01)
print(tup01)

# 2. 定位
# -- 读取(索引／切片)
print(tup[0])# 10
print(tup[:2])# (10, 20)

# 3. 遍历
for item in tup:
    print(item)

# 倒序读取每个元素
for i in range(len(tup)-1,-1,-1):
    print(i)
    print(tup[i])

# 4. 特殊
# 注意1：小括号可以省略
tup03 = 3,4,5
print(tup03)#(3, 4, 5)

# 注意2：如果元组中只有一个元素,必须有逗号
tup04 = (3,)
print(tup04)#(3,)
tup04 = 3,
print(tup04)#(3,)

# 拆包:　多个变量　= 容器
a,b,c = tup
print(f'{a}-{b}-{c}')#10-20-30
a,b,c = ["A","B","C"]
print(f'{a}-{b}-{c}')#A-B-C

a,b,c = "孙悟空"
print(f'{a}-{b}-{c}')#孙-悟-空
a,a,b = "孙悟空"
print(f'{a}-{b}')#悟-空
*a,b = "孙悟空"
print(f'{a}-{b}')#['孙', '悟']-空

#4.3 作用
#变量交换
a = 10
b = 20
a,b = b,a
print(f'{a}-{b}')#20-10

#格式化字符串
str02 = "姓名：%s, 年龄：%d" % ("马超",18)
print(str02)#姓名：马超, 年龄：18

#5 字典 dict

#.5.2 基础操作

# 1. 创建

# -- { 键1:值1, 键2:值2 }
ditc_wk = {"name":"悟空","age": 26, "sex": "男"}
print(ditc_wk)
# -- dict(  [(  ,  ),( , )]  )
# 列表转换为字典的格式要求：列表元素必须能够"一分为二"
list01 = ["八戒", ("ts", "唐僧"), [1001, "齐天大圣"]]
dict01 = dict(list01)
print(dict01)

#tup = ('name',18)  #元组不能直接变字典
#dict02 = dict(tup)
#print(dict02)

# 2. 添加 字典名[键] = 值
ditc_wk["money"]=10000
print(ditc_wk)#{'name': '悟空', 'age': 26, 'sex': '男', 'money': 10000}


# 字典不能使用 索引 切片

# 3. 定位：字典名[键]
# -- 读取
print(ditc_wk["name"])#悟空

# 注意：如果没有键则报错
# 解决：读取数据前,通过in判断.
if "name" in ditc_wk:
    print(ditc_wk["name"])#悟空

# -- 修改(与添加数据语法相同)
# 具有key为修改,没有key为添加
ditc_wk["name"]='马超'
print(ditc_wk)#{'name': '马超', 'age': 26, 'sex': '男', 'money': 10000}

# 4. 删除 del 字典名[键]
del ditc_wk["sex"]
print(ditc_wk)#{'name': '马超', 'age': 26, 'money': 10000}


# 5. 遍历
# 方式1：for 键 in 字典名称
for key in ditc_wk:
    print(key)
#name
#age
#money

# 方式2：for 值 in 字典名称.values()
for val in ditc_wk.values():
    print(val)
#马超
#26
#10000

# 方式3：for 键,值 in 字典名称.items()
for key,val in ditc_wk.items():
    print(f'{key}:{val}')
#name:马超
#age:26
#money:10000

# 数据类型名称(   ... )
print(list(ditc_wk.items()))
#[('name', '马超'), ('age', 26), ('money', 10000)]

dict02 = {"name":18,'age':26}
print(tuple(dict02.items()))
#(('name', 18), ('age', 26))



#5.3 字典推导式

list00 = [i for i in ditc_wk.keys()]
print(list00)
 
#练习1：
#将两个列表，合并为一个字典
list_name = ["张无忌","赵敏","周芷若"]
list_home = [101,102,103]
dict_name_home = {}
for i in range(3):
    dict_name_home[list_name[i]]=list_home[i]
print(dict_name_home)#{'张无忌': 101, '赵敏': 102, '周芷若': 103}

#颠倒练习1字典键值
list_fz = [item for item in dict_name_home.items()]
print(list_fz)#[('张无忌', 101), ('赵敏', 102), ('周芷若', 103)]
list_fz2 = list_fz[::-1]
print(list_fz2)#[('周芷若', 103), ('赵敏', 102), ('张无忌', 101)]
new_dict = dict(list_fz2)
print(new_dict)#{'周芷若': 103, '赵敏': 102, '张无忌': 101}






